/**
 * 手动构建箭头函数 AST
 */
import generate from '@babel/generator'
import * as types from '@babel/types'

/**
 * 目标：手动构建一个如下的箭头函数 AST 树
let a = () => {
	console.log(1)
}
 */
const ast = types.variableDeclaration('let', [
	types.variableDeclarator(
		types.identifier('a'),
		types.arrowFunctionExpression(
			// 箭头函数的参数
			[],
			// 箭头函数 函数体body； 函数体body 可以有N条语句，所以是数组
			types.blockStatement([
				types.expressionStatement(
					// console.log 属于函数调用，所有创建这样一个节点
					types.callExpression(
						types.memberExpression(
							types.identifier('console'),
							// log本身就是console对象上的属性
							types.identifier('log')
						),
						// console.log的参数
						[types.numericLiteral(1)]
					)
				),
			])
		)
	),
])

// 将 AST 生成 代码， 这里的code 是字符串
// 剩下的，我们可以将代码写入文件等等操作， 也可以做其他改造
console.log(generate(ast).code)

// 构建一个普通函数
const ast2 = types.functionDeclaration(
	// 创建一个标识符
	types.identifier('a'),
	// 函数的参数-形参
	[],
	types.blockStatement([
		types.expressionStatement(
			types.callExpression(
				types.memberExpression(
					types.identifier('console'),
					types.identifier('log')
				),
				[types.numericLiteral(1)]
			)
		),
	])
)

console.log(generate(ast2).code)